package uade.distribuidas.cliente.servlet;

import java.io.IOException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import uade.distribuidas.cliente.util.xmlReader;
import uade.distribuidas.repo.dto.FacturaDTO;
import uade.distribuidas.repo.dto.ItemFacturaDTO;
import uade.distribuidas.repo.dto.MercaderiaDTO;
import uade.distribuidas.repo.dto.RemitoODVDTO;
import uade.distribuidas.repo.exception.ExceptionCliente;
import uade.distribuidas.repo.exception.ExceptionFactura;
import uade.distribuidas.repo.exception.ExceptionRemito;
import uade.distribuidas.repo.interfaces.ManagerFacturasIf;
import uade.distribuidas.repo.interfaces.ManagerRemitosIf;
import uade.distribuidas.repo.type.EnvioType;
import uade.distribuidas.repo.type.EstadoFacturaType;



public class ControladorVenta extends HttpServlet {

	private static final long serialVersionUID = 1087702007634924546L;
	private static final String ERROR = "/ERROR.jsp";
	private final String JSP_DIR = "jsp/facturas";
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
    	
	    	
	    	ManagerFacturasIf ManagerFacturasIf = null;
			try {
				ManagerFacturasIf = (ManagerFacturasIf)Naming.lookup ("//localhost:1099/ManagerFacturasIf");
			} catch (NotBoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
            String action = request.getParameter("action");
            String jspPage = "/index.jsp";

            if ((action == null) || (action.length() < 1))
            {
                action = "default";
            }

            if ("default".equals(action))
            {
                jspPage = "/index.jsp";
            }
            else if ("displaylist".equals(action))
            {
                List<FacturaDTO> facturas;
				try {
					facturas = ManagerFacturasIf.getFacturas();
					request.setAttribute("facturas", facturas);
					jspPage = JSP_DIR+"/MostrarLista.jsp";
				} catch (ExceptionFactura e) {
					request.setAttribute("errorMsg", new ExceptionCliente("No fue posible obtener el listado de facturas"));
					jspPage = ERROR;
					e.printStackTrace();
				}
            }
            else if ("display".equals(action))
            {
                Integer id = Integer.valueOf(request.getParameter("id"));
                FacturaDTO factura;
				try {
					factura = ManagerFacturasIf.getFactura(id);
					request.setAttribute("factura", factura);
					jspPage = JSP_DIR+"/Mostrar.jsp";
				} catch (ExceptionFactura e) {
					request.setAttribute("errorMsg", new ExceptionFactura("No fue posible obtener los datos de la factura"));
					jspPage = ERROR;
					e.printStackTrace();
				}
            } else if ("facturar".equals(action))
            {
            	Integer idRemito = Integer.valueOf(request.getParameter("idRemito"));
            try{
            	ManagerRemitosIf ManagerRemitosIf = null;
    			try {
    				ManagerRemitosIf = (ManagerRemitosIf)Naming.lookup ("//localhost:1099/ManagerRemitosIf");
    			} catch (NotBoundException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
            	RemitoODVDTO remito = (RemitoODVDTO) ManagerRemitosIf.getRemito(idRemito);
            	FacturaDTO factura = null;
            	if (remito!=null) {
					factura = new FacturaDTO();
					factura.setNumero(remito.getId()+"_F");
					factura.setCliente(remito.getCliente());
					factura.setCondiciones(remito.getCliente().getCondicionesVenta());
					factura.setEmision(new Date());
					factura.setEnvio(EnvioType.PENDIENTE);
					factura.setEstado(EstadoFacturaType.PENDIENTE);
					factura.setRemito(remito);
					factura.setTipoPago("Pago Contado");
					Calendar cal = Calendar.getInstance();
					cal.add(Calendar.DATE, 60);
					factura.setVencimiento(cal.getTime());
					for (MercaderiaDTO i : remito.getItems()) {
						ItemFacturaDTO item = new ItemFacturaDTO();
						item.setCantidad(i.getCantidad());
						item.setPrecioUnidad(i.getRodamiento().getPrecio());
						item.setRodamiento(i.getRodamiento());	
					}
					factura.calcularTotal();
				}
            	if (factura!=null) {
					ManagerFacturasIf.save(factura);
					xmlReader.saveFacturaToXml(factura);
				}
            	
					request.setAttribute("factura", factura);
					request.setAttribute("successMsg", "Factura Generada con exito");
					jspPage = JSP_DIR+"/Mostrar.jsp";            
				} catch (ExceptionFactura | ExceptionRemito e) {
					request.setAttribute("errorMsg", new ExceptionFactura("No fue posible generar la factura"));
					jspPage = ERROR;

				}
            }
            dispatch(jspPage, request, response);
        }
    
        protected void dispatch(String jsp, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
            if (jsp != null)
            {
                RequestDispatcher rd = request.getRequestDispatcher(jsp);
                rd.forward(request, response);
            }
        }

        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
        {
            doPost(request, response);
        }
}
